package com.sunriz.refreshhcdata.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * ClassName: XlsxUtils
 * Package: com.sunriz.refreshhcdata.utils
 * Description:
 *
 * @Author BuTang
 * @Create 2024/11/21 14:02
 * @Version 1.0
 */

@Slf4j
public class ExcelAppender {
    // 基础日志路径
    private static final String BASE_LOGS_PATH = "D:\\develop\\code\\RefreshHcData\\xlsx\\";

    // 工作簿对象
    private Workbook workbook;

    // 当前工作表
    private Sheet sheet;

    // 动态生成的文件名
    private String fileName;

    // 完整路径
    private String fullFilePath;

    // 当前行号
    private int currentRow;

    /**
     * 构造方法，初始化文件名、路径、工作簿和工作表。
     * 如果文件不存在，则自动创建新文件。
     */
    public ExcelAppender() {
        // 获取当前时间并格式化为文件名
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");
        fileName = now.format(formatter) + ".xlsx";
        fullFilePath = BASE_LOGS_PATH + fileName;

        // 创建 Workbook 和默认 Sheet
        workbook = new XSSFWorkbook();
        sheet = workbook.createSheet("192.168.1.300_1_1");
        // 从第 0 行开始
        currentRow = 0;
        // 自动创建文件
        createFileIfNotExist();
    }


    /**
     * 向 Excel 文件中追加一行数据
     *
     * @param rowData 数据数组，每个元素对应一列
     */
    public void appendRow(String[] rowData) {
        if (workbook == null || sheet == null) {
            throw new IllegalStateException("工作簿未初始化！");
        }

        // 创建新行并写入数据
        Row row = sheet.createRow(currentRow++);
        for (int i = 0; i < rowData.length; i++) {
            row.createCell(i).setCellValue(rowData[i]);
        }
    }

    /**
     * 保存 Excel 文件到磁盘
     */
    public void save() {
        try (FileOutputStream fos = new FileOutputStream(fullFilePath)) {
            workbook.write(fos);
            log.info("数据已保存到文件: {}" ,fullFilePath);
        } catch (IOException e) {
            throw new RuntimeException("保存 Excel 文件失败: " + e.getMessage(), e);
        }
    }

    /**
     * 释放资源，关闭工作簿
     */
    public void close() {
        try {
            if (workbook != null) {
                workbook.close();
                log.info("工作簿已关闭");
            }
        } catch (IOException e) {
            throw new RuntimeException("关闭工作簿失败: " + e.getMessage(), e);
        }
    }

    /**
     * 获取文件的完整路径
     *
     * @return 文件路径
     */
    public String getFullFilePath() {
        return fullFilePath;
    }

    /**
     * 如果文件不存在，则自动创建新文件
     */
    private void createFileIfNotExist() {
        File file = new File(fullFilePath);

        // 如果文件不存在，则创建新的 Excel 文件
        if (!file.exists()) {
            try (FileOutputStream fos = new FileOutputStream(fullFilePath)) {
                workbook.write(fos);
                log.info("文件不存在，已创建文件: {}" + fullFilePath);
            } catch (IOException e) {
                throw new RuntimeException("创建 Excel 文件失败: " + e.getMessage(), e);
            }
        } else {
            log.info("文件已存在: {}" + fullFilePath);
        }
    }
}